package com.zpark;

import com.zpark.pojo.Student;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.List;

/**
 * @PackageName: com.zpark
 * @ClassName: DOM4JParseXmlFileDemo
 * @Description: 使用dom4j解析xml
 * @author: RZS
 * @date: 2021/8/15  21:25
 */
public class DOM4JParseXmlFileDemo {
    /*
     * 使用dom4j解析xml的大致步骤
     * 1.创建SAXReader
     * 2.使用SAXReader读取xml文档并且生成Document对象。
     * 	  这一步也是dom解析耗资源的地方，因为首先要先将文档所有数据读取完毕，并且以一个Document对象
     * 	  的形式保存在内存当中
     * 3.通过Document对象获取根元素
     * 4.按照xml文档的结构从根元素开始逐级遍历xml文档数据的目的
     */
    public static void main(String[] args) throws Exception {
        // 获取xml文件路径
        String path = DOM4JParseXmlFileDemo.class.getClassLoader().getResource("dom4j.xml").getPath();
        // 由于路径中包含中文，所以需要对路径解析解码
        path = URLDecoder.decode(path, "utf-8");
        // 定义集合，用于存放xml取出的student信息
        List<Student> list = new ArrayList<Student>();
        SAXReader reader = new SAXReader();
        /*
         * Document提供了获取根元素的方法：Element getRootElement()
         *
         * 而element的每一个实例用于表示当前xml文件的一个元素（一对标签），它提供了获取
         * 其元素相关的方法：
         * 获取当前标签的名字：String getName()
         * 获取当前标签中间的文本：String getText()
         * 获取当前标签下指定名字的子标签：Element element(String name)
         * 获取当前标签下的所有子标签：List elements()
         * 获取当前标签下指定名字的子标签：List elements(String name)
         *
         * 获取当前标签下指定名字标签的属性：Attribute sttribute(String name)
         * Attribute的每一个实例表示一个属性，它有两个方法：
         * 获取属性名：String getName()
         * 获取属性值：String getValue()
         */
        Document document = reader.read(path);
        // 获取根元素
        Element rootElement = document.getRootElement();
        // 获取根元素下的所有子标签
        List<Element> elements = rootElement.elements();
        for (Element element : elements) {
            Student student = new Student();
            // 将获取回来的值添加到Student对象中
            student.setName(element.elementText("name"));
            student.setAge(Integer.parseInt(element.elementText("age")));
            student.setLocation(element.elementText("location"));
            // 将student对象存入集合
            list.add(student);
        }
        System.out.println(list);
    }
}
